package eu.hellek.gba.server.utils;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.junit.Test;
import com.beoui.geocell.GeocellUtils;
import com.beoui.geocell.model.BoundingBox;
public class UtilsTest {
@Test
public void geoCellDistanceTest() {
String center = "31bcb56fl";
String newcell;
int dist_diag = 78;
int dist_straight_ns = 60;
int dist_straight_we = 50;
int runs = 10;
newcell = center;
for(int i = 0; i < runs; i++) { // nw
newcell = MyGeocellUtils.adjacent(newcell, new int[] {-1, 1});
}
assertEquals(dist_diag, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // sw
newcell = MyGeocellUtils.adjacent(newcell, new int[] {-1, -1});
}
assertEquals(dist_diag, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // ne
newcell = MyGeocellUtils.adjacent(newcell, new int[] {1, 1});
}
assertEquals(dist_diag, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // se
newcell = MyGeocellUtils.adjacent(newcell, new int[] {-1, 1});
}
assertEquals(dist_diag, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // n
newcell = MyGeocellUtils.adjacent(newcell, new int[] {0, 1});
}
assertEquals(dist_straight_ns, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // n
newcell = MyGeocellUtils.adjacent(newcell, new int[] {0, -1});
}
assertEquals(dist_straight_ns, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // e
newcell = MyGeocellUtils.adjacent(newcell, new int[] {1, 0});
}
assertEquals(dist_straight_we, Utils.distanceBetweenGeoCells(center, newcell));
newcell = center;
for(int i = 0; i < runs; i++) { // e
newcell = MyGeocellUtils.adjacent(newcell, new int[] {-1, 0});
}
assertEquals(dist_straight_we, Utils.distanceBetweenGeoCells(center, newcell));
/*
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
newcell = center;
newcell = GeocellUtils.adjacent(newcell, new int[] {i, j});
System.err.print(i + "\t" + j);
System.err.println("\t" + Utils.distanceBetweenGeoCells(center, newcell));
}
}*/
}
@Test
public void tempTest() {
String center = "31bcb56fr";
for(int i = -1; i <= 1; i++) { // 2 schleifen um alle 9 m�glichen cells zu durchlaufen
for(int j = -1; j<= 1; j++) {
String neighbour = MyGeocellUtils.adjacent(center, new int [] {i, j});
BoundingBox bb_center = MyGeocellUtils.computeBox(center);
BoundingBox bb_neighbour = MyGeocellUtils.computeBox(neighbour);
double distance = 0;
if(Math.abs(i) == 1 && Math.abs(j) == 1) {
distance = 3.9;
} else if(Math.abs(i) == 0 && Math.abs(j) == 1) {
distance = 3;
} else if(Math.abs(i) == 1 && Math.abs(j) == 0) {
distance = 2.5;
} else { // selbe position
distance = 0;
}
// System.err.println("Distance: " + distance + " or " + GeocellUtils.distance(bb_center.getNorthEast(), bb_neighbour.getNorthEast()));
assertEquals(distance*100, GeocellUtils.distance(bb_center.getNorthEast(), bb_neighbour.getNorthEast()), 12);
}
}
}
@Test
public void interpolationTest() {
String cell1 = "31bcb57al";
String cell2 = "31bcb57ar";
String cell3 = "31bcb57bl";
assertEquals(MyGeocellUtils.interpolationCount(cell1, cell1), 1);
assertEquals(MyGeocellUtils.interpolationCount(cell2, cell2), 1);
assertEquals(MyGeocellUtils.interpolationCount(cell2, cell1), 2);
assertEquals(MyGeocellUtils.interpolationCount(cell3, cell2), 2);
assertEquals(MyGeocellUtils.interpolationCount(cell3, cell1), 3);
int dist_vert = 6;
int dist_hor = 5;
int dist_diag = 8;
for(int i = -2; i <= 2; i++) {
for(int j = -2; j <= 2; j++) {
String neighbour;
if (Math.abs(j) == 2 || Math.abs(i) == 2) {
if(Math.abs(i) == 2 && Math.abs(j) == 2) {
neighbour = MyGeocellUtils.adjacent(cell1, new int [] {i/2, j/2});
neighbour = MyGeocellUtils.adjacent(neighbour, new int [] {i/2, j/2});
} else if(Math.abs(i) == 2) {
neighbour = MyGeocellUtils.adjacent(cell1, new int [] {i/2, j});
neighbour = MyGeocellUtils.adjacent(neighbour, new int [] {i/2, 0});
} else if(Math.abs(j) == 2) {
neighbour = MyGeocellUtils.adjacent(cell1, new int [] {i, j/2});
neighbour = MyGeocellUtils.adjacent(neighbour, new int [] {0, j/2});
} else {
System.err.println("AStar: this point should not get reached ever.");
neighbour = null;
}
} else {
neighbour = MyGeocellUtils.adjacent(cell1, new int [] {i, j});
}
int distance = 0;
if(i == 0 && j == 0) {
distance = 1;
} else if(i == 0 && Math.abs(j) != 0) {
distance = dist_vert * Math.abs(j);
} else if(j == 0 && Math.abs(i) != 0) {
distance = dist_hor * Math.abs(i);
} else if(i != 0 && Math.abs(i) == Math.abs(j)) {
distance = dist_diag * Math.abs(i);
} else if(i != 0 && j != 0 && Math.abs(i) + Math.abs(j) == 3) {
distance = dist_diag + (dist_diag / 2);
} else {
System.err.println("this should not happen");
distance = 99;
}
//System.err.println(i + "\t" + j + "\t" + distance + "\t" + Utils.distanceBetweenGeoCells(cell1, neighbour));
assertEquals(distance, Utils.distanceBetweenGeoCells(cell1, neighbour), 1);
}
}
}
@Test
public void adjacentTest() {
String cell1 = "31bcb5f3r";
String cell2 = "31bcb5f3l";
String cell3 = "31bcb5f9l";
assertEquals(MyGeocellUtils.adjacent(cell1, new int[] {-1, 0}), cell2);
assertEquals(MyGeocellUtils.adjacent(cell2, new int[] { 1, 0}), cell1);
assertEquals(MyGeocellUtils.adjacent(cell3, new int[] { 1, -1}), cell1);
assertEquals(MyGeocellUtils.adjacent(cell3, new int[] { 0, -1}), cell2);
}
@Test
public void computeCellTest() {
String cell = MyGeocellUtils.compute(new com.beoui.geocell.model.Point(-34.60899,-58.380725), Utils.geoCellResolution);
assertEquals(cell, "31bcb57al");
// System.err.println(cell);
cell = MyGeocellUtils.compute(new com.beoui.geocell.model.Point(-34.608946,-58.378569), Utils.geoCellResolution);
assertEquals(cell, "31bcb57ar");
// System.err.println(cell);
cell = MyGeocellUtils.compute(new com.beoui.geocell.model.Point(-34.608804,-58.375715), Utils.geoCellResolution);
assertEquals(cell, "31bcb57bl");
// System.err.println(cell);
}
@Test
public void computeBoxTest() {
String cell1 = "31bcb57al";
String cell2 = "31bcb57ar";
String cell3 = "31bcb57bl";
String cell4 = "31bcb57br";
String [] s = new String [] { cell1, cell2, cell3, cell4 };
for(String ss : s) {
BoundingBox bb_res = MyGeocellUtils.computeBox(ss);
System.out.print(bb_res.getNorth() + "," + bb_res.getEast() + ",");
System.out.print(bb_res.getSouth() + "," + bb_res.getWest() + ",");
}
System.err.println();
}
@Test
public void boundingBoxSearchTest() {
BoundingBox bb = new BoundingBox(-34.66, -58.40, -34.67, -58.41);
List<String> cells = MyGeocellUtils.bestBboxSearchCells(bb, new MyCostFunction());
assertEquals(cells.size(), 20);
/*for(String s : cells) {
System.err.println(s);
/*BoundingBox bb_res = MyGeocellUtils.computeBox(s);
System.out.print(bb_res.getNorth() + "," + bb_res.getEast() + ",");
System.out.print(bb_res.getSouth() + "," + bb_res.getWest() + ",");*/
// }
}
}